﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Kinect;

namespace KinectPowerPointControl_sample1_Fukidashi
{
    static class ProcesLightSwitchGesture
    {
        private static long lastActivated = 0; //最後にこのジェスチャーが発生したタイミング（100ナノ秒単位のtickで保持）
        private static long SLEEP_TIME = 5 * 1000 * 1000 * 10; //発動後、発動を抑える時間

        public static bool hasSwitched(LinkedList<SkeletonLog> skeletonLogs)
        {
            if (DateTime.Now.Ticks - lastActivated > SLEEP_TIME) { lastActivated = 0; } //発動後、発動を抑える時間が経過した場合
            if (skeletonLogs.Count < 7 ||   //直近1.8秒の断面が存在しない場合
                lastActivated > 0)          //発動後、発動を抑える時間が経過した場合
            {
                return false; 
            }

            LinkedList<SkeletonLog>.Enumerator e = skeletonLogs.GetEnumerator();

            //以下を満たすか
            //最新と2.1秒前で、HandRight（右手）のX,Y軸の位置が5cm以上動いていない、かつ両時点でHead（頭）よりも右手が上にある。
            //最新～2.1秒前のどこかの時点で、最新状態よりHandRight（右手）が10cm以上下がっている。
            
            //最新断面の情報を格納
            if (!e.MoveNext()) { return false; }
            if( e.Current.joints[JointType.HandRight].Position.Y <
                e.Current.joints[JointType.Head].Position.Y)
            {
                return false; //右手が頭より下にあった場合、検出なし
            }

            float first_x = e.Current.joints[JointType.HandRight].Position.X;
            float first_y = e.Current.joints[JointType.HandRight].Position.Y;

            //0.3秒前～1.5秒前の断面をチェック
            Boolean ifAnyHandLogMeetsRequirement = false;
            for (int i = 0; i < 6; i++)
            {
                if (!e.MoveNext()) { return false; }
                if (first_y - e.Current.joints[JointType.HandRight].Position.Y > 0.10)
                {
                    ifAnyHandLogMeetsRequirement = true;
                }
            }
            if (!ifAnyHandLogMeetsRequirement) { return false; }

            //1.8秒前断面をチェック
            if (!e.MoveNext()) { return false; }
            if (Math.Abs(first_x - e.Current.joints[JointType.HandRight].Position.X) > 0.10 &&
                Math.Abs(first_y - e.Current.joints[JointType.HandRight].Position.Y) > 0.10)
            {
                return false;
            }
            if (e.Current.joints[JointType.HandRight].Position.Y <
                e.Current.joints[JointType.Head].Position.Y)
            {
                return false; //右手が頭より下にあった場合、検出なし
            }

            lastActivated = DateTime.Now.Ticks;
            return true;
        }

    }

}
